<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Building Bar Charts | Elasticsearch: The Definitive Guide [2.x] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: The Definitive Guide [2.x]">
<link rel="up" href="aggregations.html" title="Aggregations">
<link rel="prev" href="_one_final_modification.html" title="One Final Modification">
<link rel="next" href="_looking_at_time.html" title="Looking at Time">
<meta name="DC.type" content="Learn/Docs/Legacy/Elasticsearch/Definitive Guide/2.x">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<p>
  <strong>WARNING</strong>: The 2.x versions of Elasticsearch have passed their
  <a href="https://www.elastic.co/support/eol">EOL dates</a>. If you are running
  a 2.x version, we strongly advise you to upgrade.
</p>
<p>
  This documentation is no longer maintained and may be removed. For the latest
  information, see the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">current
  Elasticsearch documentation</a>.
</p>
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: The Definitive Guide [2.x]</a></span>
»
<span class="breadcrumb-link"><a href="aggregations.html">Aggregations</a></span>
»
<span class="breadcrumb-node">Building Bar Charts</span>
</div>
<div class="navheader">
<span class="prev">
<a href="_one_final_modification.html">« One Final Modification</a>
</span>
<span class="next">
<a href="_looking_at_time.html">Looking at Time »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_building_bar_charts"></a>Building Bar Charts<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/300_Aggregations/30_histogram.asciidoc">edit</a>
</h2>
</div></div></div>
<p>One of the exciting aspects of aggregations are how easily they are converted
into charts and graphs.  In this chapter, we are focusing
on various analytics that we can wring out of our example dataset.  We will also
demonstrate the types of charts aggregations can power.</p>
<p>The <code class="literal">histogram</code> bucket is particularly useful.  Histograms are essentially
bar charts, and if you’ve ever built a report or analytics dashboard, you
undoubtedly had a few bar charts in it. The histogram works by specifying an interval.  If we were histogramming sale
prices, you might specify an interval of 20,000.  This would create a new bucket
every $20,000.  Documents are then sorted into buckets.</p>
<p>For our dashboard, we want to know how many cars sold in each price range.  We
would also like to know the total revenue generated by that price bracket.  This is
calculated by summing the price of each car sold in that interval.</p>
<p>To do this, we use a <code class="literal">histogram</code> and a nested <code class="literal">sum</code> metric:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /cars/transactions/_search
{
   "size" : 0,
   "aggs":{
      "price":{
         "histogram":{ <a id="CO193-1"></a><i class="conum" data-value="1"></i>
            "field": "price",
            "interval": 20000
         },
         "aggs":{
            "revenue": {
               "sum": { <a id="CO193-2"></a><i class="conum" data-value="2"></i>
                 "field" : "price"
               }
             }
         }
      }
   }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/30_histogram.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO193-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">histogram</code> bucket requires two parameters: a numeric field, and an
interval that defines the bucket size.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO193-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>A <code class="literal">sum</code> metric is nested inside each price range, which will show us the
total revenue for that bracket</p>
</td>
</tr>
</table>
</div>
<p>As you can see, our query is built around the <code class="literal">price</code> aggregation, which contains
a <code class="literal">histogram</code> bucket.  This bucket requires a numeric field to calculate
buckets on, and an interval size.  The interval defines how "wide" each bucket
is.  An interval of 20000 means we will have the ranges <code class="literal">[0-19999, 20000-39999, ...]</code>.</p>
<p>Next, we define a nested metric inside the histogram.  This is a <code class="literal">sum</code> metric, which
will sum up the <code class="literal">price</code> field from each document landing in that price range.
This gives us the revenue for each price range, so we can see if our business
makes more money from commodity or luxury cars.</p>
<p>And here is the response:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
...
   "aggregations": {
      "price": {
         "buckets": [
            {
               "key": 0,
               "doc_count": 3,
               "revenue": {
                  "value": 37000
               }
            },
            {
               "key": 20000,
               "doc_count": 4,
               "revenue": {
                  "value": 95000
               }
            },
            {
               "key": 80000,
               "doc_count": 1,
               "revenue": {
                  "value": 80000
               }
            }
         ]
      }
   }
}</pre>
</div>
<p>The response is fairly self-explanatory, but it should be noted that the
histogram keys correspond to the lower boundary of the interval.  The key <code class="literal">0</code>
means <code class="literal">0-19,999</code>, the key <code class="literal">20000</code> means <code class="literal">20,000-39,999</code>, and so forth.</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>You’ll notice that empty intervals, such as $40,000-60,000, is missing in the
response.  The <code class="literal">histogram</code> bucket omits these by default, since it could lead
to the unintended generation of potentially enormous output.</p>
<p>We’ll discuss how to include empty buckets in the next section, <a class="xref" href="_returning_empty_buckets.html" title="Returning Empty Buckets">Returning Empty Buckets</a>.</p>
</div>
</div>
<p>Graphically, you could represent the preceding data in the histogram shown in <a class="xref" href="_building_bar_charts.html#barcharts-histo1" title="Sales and Revenue per price bracket">Figure 35, “Sales and Revenue per price bracket”</a>.</p>
<div id="barcharts-histo1" class="imageblock">
<div class="content">
<img src="images/elas_28in01.png" alt="Sales and Revenue per price bracket">
</div>
<div class="title">Figure 35. Sales and Revenue per price bracket</div>
</div>
<p>Of course, you can build bar charts with any aggregation that emits categories
and statistics, not just the <code class="literal">histogram</code> bucket.  Let’s build a bar chart of the
top 10 most popular makes, and their average price, and then calculate the standard
error to add error bars on our chart.  This will use the <code class="literal">terms</code> bucket and
an <code class="literal">extended_stats</code> metric:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET /cars/transactions/_search
{
  "size" : 0,
  "aggs": {
    "makes": {
      "terms": {
        "field": "make",
        "size": 10
      },
      "aggs": {
        "stats": {
          "extended_stats": {
            "field": "price"
          }
        }
      }
    }
  }
}</pre>
</div>
<p>This will return a list of makes (sorted by popularity) and a variety of statistics
about each.  In particular, we are interested in <code class="literal">stats.avg</code>, <code class="literal">stats.count</code>,
and <code class="literal">stats.std_deviation</code>.  Using this information, we can calculate the standard error:</p>
<pre class="literallayout">std_err = std_deviation / count</pre>

<p>This will allow us to build a chart like <a class="xref" href="_building_bar_charts.html#barcharts-bar1" title="Average price of all makes, with error bars">Figure 36, “Average price of all makes, with error bars”</a>.</p>
<div id="barcharts-bar1" class="imageblock">
<div class="content">
<img src="images/elas_28in02.png" alt="Average price of all makes, with error bars">
</div>
<div class="title">Figure 36. Average price of all makes, with error bars</div>
</div>
<p></p>
</div>
<div class="navfooter">
<span class="prev">
<a href="_one_final_modification.html">« One Final Modification</a>
</span>
<span class="next">
<a href="_looking_at_time.html">Looking at Time »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
